package com.mashibing.jvm.c3_jmm;

import com.mashibing.jvm.agent.ObjectSizeAgent;

public class T03_SizeOfAnObject {
    public static void main(String[] args) {
        // 16 字节：markword 8 字节，class pointer 4 字节（因为开启了 -XX:+UseCompressedOops，本来是 8 字节），填充 Padding 对齐 4 字节
        System.out.println(ObjectSizeAgent.sizeOf(new Object()) + " 字节");
        // 16 字节：markword 8 字节，class pointer 4 字节，数组长度 4 字节
        System.out.println(ObjectSizeAgent.sizeOf(new int[] {}) + " 字节");
        System.out.println(ObjectSizeAgent.sizeOf(new P()) + " 字节");
    }

    // 一个Object占多少个字节
    // 开启指针压缩：-javaagent:D:\Dev\Codes\mashibing\ObjectSize\target\ObjectSize.jar
    // 关闭指针压缩：-javaagent:D:\Dev\Codes\mashibing\ObjectSize\target\ObjectSize.jar -XX:-UseCompressedClassPointers
    // -XX:+UseCompressedClassPointers （对象头里的指针，指向当前是哪个类）
    // -XX:+UseCompressedOops 是 Oops = ordinary object pointers （类成员变量的指针）
    //
    private static class P {
                        // 8 字节 _markword
                        // 4 字节 _class pointer
        int id;         // 4 字节
        String name;    // 4 字节 Oops
        int age;        // 4 字节

        byte b1;        // 1 字节
        byte b2;        // 1 字节

        Object o;       // 4 字节 Oops
        byte b3;        // 1 字节

    }
}
